module Shifter (value_in, shiftop, shiftamt, result);

    // Input
	input        [31:0] value_in;
	input         [1:0] shiftop;
	input         [4:0] shiftamt;

	// Output
	output       [31:0] result;

    // Wire assignment
    reg [31:0] result_reg;
    assign result = (shiftop == 2'b00) ? (value_in >> shiftamt) :
        (shiftop == 2'b10) ? (value_in << shiftamt) :
        (shiftop == 2'b01) ? result_reg : 32'bz;

    always @(value_in or shiftop or shiftamt) begin
        
        // Shift right arithmetic
        result_reg[0 ] <= ((0  + shiftamt) < 32) ? value_in[(0  + shiftamt)] : value_in[31];
        result_reg[1 ] <= ((1  + shiftamt) < 32) ? value_in[(1  + shiftamt)] : value_in[31];
        result_reg[2 ] <= ((2  + shiftamt) < 32) ? value_in[(2  + shiftamt)] : value_in[31];
        result_reg[3 ] <= ((3  + shiftamt) < 32) ? value_in[(3  + shiftamt)] : value_in[31];
        result_reg[4 ] <= ((4  + shiftamt) < 32) ? value_in[(4  + shiftamt)] : value_in[31];
        result_reg[5 ] <= ((5  + shiftamt) < 32) ? value_in[(5  + shiftamt)] : value_in[31];
        result_reg[6 ] <= ((6  + shiftamt) < 32) ? value_in[(6  + shiftamt)] : value_in[31];
        result_reg[7 ] <= ((7  + shiftamt) < 32) ? value_in[(7  + shiftamt)] : value_in[31];
        result_reg[8 ] <= ((8  + shiftamt) < 32) ? value_in[(8  + shiftamt)] : value_in[31];
        result_reg[9 ] <= ((9  + shiftamt) < 32) ? value_in[(9  + shiftamt)] : value_in[31];
        result_reg[10] <= ((10 + shiftamt) < 32) ? value_in[(10 + shiftamt)] : value_in[31];
        result_reg[11] <= ((11 + shiftamt) < 32) ? value_in[(11 + shiftamt)] : value_in[31];
        result_reg[12] <= ((12 + shiftamt) < 32) ? value_in[(12 + shiftamt)] : value_in[31];
        result_reg[13] <= ((13 + shiftamt) < 32) ? value_in[(13 + shiftamt)] : value_in[31];
        result_reg[14] <= ((14 + shiftamt) < 32) ? value_in[(14 + shiftamt)] : value_in[31];
        result_reg[15] <= ((15 + shiftamt) < 32) ? value_in[(15 + shiftamt)] : value_in[31];
        result_reg[16] <= ((16 + shiftamt) < 32) ? value_in[(16 + shiftamt)] : value_in[31];
        result_reg[17] <= ((17 + shiftamt) < 32) ? value_in[(17 + shiftamt)] : value_in[31];
        result_reg[18] <= ((18 + shiftamt) < 32) ? value_in[(18 + shiftamt)] : value_in[31];
        result_reg[19] <= ((19 + shiftamt) < 32) ? value_in[(19 + shiftamt)] : value_in[31];
        result_reg[20] <= ((20 + shiftamt) < 32) ? value_in[(20 + shiftamt)] : value_in[31];
        result_reg[21] <= ((21 + shiftamt) < 32) ? value_in[(21 + shiftamt)] : value_in[31];
        result_reg[22] <= ((22 + shiftamt) < 32) ? value_in[(22 + shiftamt)] : value_in[31];
        result_reg[23] <= ((23 + shiftamt) < 32) ? value_in[(23 + shiftamt)] : value_in[31];
        result_reg[24] <= ((24 + shiftamt) < 32) ? value_in[(24 + shiftamt)] : value_in[31];
        result_reg[25] <= ((25 + shiftamt) < 32) ? value_in[(25 + shiftamt)] : value_in[31];
        result_reg[26] <= ((26 + shiftamt) < 32) ? value_in[(26 + shiftamt)] : value_in[31];
        result_reg[27] <= ((27 + shiftamt) < 32) ? value_in[(27 + shiftamt)] : value_in[31];
        result_reg[28] <= ((28 + shiftamt) < 32) ? value_in[(28 + shiftamt)] : value_in[31];
        result_reg[29] <= ((29 + shiftamt) < 32) ? value_in[(29 + shiftamt)] : value_in[31];
        result_reg[30] <= ((30 + shiftamt) < 32) ? value_in[(30 + shiftamt)] : value_in[31];
        result_reg[31] <= ((31 + shiftamt) < 32) ? value_in[(31 + shiftamt)] : value_in[31];
        
    end

endmodule
